package com.gobang.common.util;

import com.gobang.common.exception.ScoreException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 积分计算工具类
 * 封装积分计算规则和验证逻辑
 * 
 * @author System
 * @since 1.0.0
 */
@Component
@Slf4j
public class ScoreUtils {

    /**
     * 胜利积分奖励
     */
    private static final int WIN_SCORE = 5;

    /**
     * 失败积分扣除
     */
    private static final int LOSE_SCORE = -3;

    /**
     * 最低积分
     */
    private static final int MIN_SCORE = 0;

    /**
     * 根据游戏结果计算积分变化
     *
     * @param gameResult 游戏结果（WIN/LOSE）
     * @return 积分变化值
     */
    public static int calculateScoreChange(String gameResult) {
        if ("WIN".equals(gameResult)) {
            return WIN_SCORE;
        } else if ("LOSE".equals(gameResult)) {
            return LOSE_SCORE;
        } else {
            throw ScoreException.invalidChange("无效的游戏结果: " + gameResult);
        }
    }

    /**
     * 验证并计算新积分
     *
     * @param currentScore 当前积分
     * @param scoreChange 积分变化
     * @return 新积分
     */
    public static int validateNewScore(int currentScore, int scoreChange) {
        int newScore = currentScore + scoreChange;
        
        // 积分不能低于0
        if (newScore < MIN_SCORE) {
            newScore = MIN_SCORE;
        }
        
        return newScore;
    }

    /**
     * 验证积分变化是否合法
     *
     * @param scoreChange 积分变化值
     * @return 是否合法
     */
    public static boolean isValidScoreChange(int scoreChange) {
        return scoreChange == WIN_SCORE || scoreChange == LOSE_SCORE;
    }

    /**
     * 获取胜利积分奖励值
     *
     * @return 胜利积分奖励
     */
    public static int getWinScore() {
        return WIN_SCORE;
    }

    /**
     * 获取失败积分扣除值
     *
     * @return 失败积分扣除
     */
    public static int getLoseScore() {
        return LOSE_SCORE;
    }

    /**
     * 获取积分下限值
     *
     * @return 积分下限
     */
    public static int getMinScore() {
        return MIN_SCORE;
    }
} 